home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Stolen Data 2
/
Stolen Data 2.adf
/
Text
/
Vec.txt
< prev
Wrap
Text File
|
1989-11-02
|
5KB
|
181 lines
---------------- More advanced coding techniques ----------------
----------- By Kreator of ANARCHY UK ----------
---- 3 D routines ----
I am going to approach this topic
from a mathematical point of view, the
mathematics invloved are quite simple
but if you are not particularly adept
in this area dont worry it isn't
essential to understand the underlying
theory.
Now suppose we are given an object
to transfer into a wireframe
representation on screen. We must
construct a list of coordinates which
specify the vertices of the object and
also a connection list which tells the
computer how to connect these points
together.
eg. A cube has 8 vertices, and
12 connecting sides, the vertices are
as follows
(50,50,50) (-50,50,50) (-50,-50,50)
(50,-50,50) (50,50,-50) (50,-50,-50)
(-50,-50,-50) (-50,50,-50)
and if these are then labelled 1-8 we
have the connections as follows
1-2 2-3 3-4 4-1 5-6 6-7 7-8 8-5
1-5 2-6 3-7 4-8
If you don't believe the example try
to draw the cube yourself and
visualise the coordinates. Notice that
the point (0,0,0) is at the centre of
the cube, this is important because in
our rotations this will be the only
point which remains stationary.
When rotating the object what we are
in fact doing is rotating the vertices
about the fixed ORIGIN (0,0,0). There
is a mathematical theorem which states
that any 3 dimensional rotation can be
split into 3 individual rotations in
only 2 dimensions, which is a much
simpler thing to calculate. Now in
general it is quite difficult to
calculate these rotations from an
arbitrary 3D rotation, but happily
enough this doesn't matter when
writing demos because by simply
performing 2D rotations and varying
the 3 Angles of rotation we achieve
an interesting effect.
The formula for 2D rotation is given
as follows,
x = X cos(s) - Y sin(s)
y = Y cos(s) + X sin(s)
This can easily be shown with simple
trigonometry.
These formulae enable us to rotate a
point in just two dimensions, but all
we now do is to rotate the point three
times in different planes.
In other words if we are given a
general point (x,y,z) and a,b,c are
the three angles of rotation then to
calculate the rotated point follow the
procedure below (just for interest the
angles a,b,c are called the Euler
angles)
x1 = x cos(a) - y sin(a)
y1 = y cos(a) + x sin(a)
y2 = y1 cos(b) - z sin(b)
z1 = z cos(b) + y1 sin(b)
z2 = z1 cos(c) - x1 sin(c)
x2 = x1 cos(c) + z1 sin(c)
Then (x2,y2,z2) holds the rotated
coordinate. To implement this on the
Amiga use a Sintable which has values
from -32768 to 32767, this can be
reused for the cosine calculations
as cos (a) = sin (a+90 degrees). You
could code the routine something like
Move x,d3
Move y,d4
Move z,d5
Lea Sin,a0
Lea Cos,a1
Move d3,d6
Move d4,d7
Move a,d0 ;a holds 2x the angle
Move (a0,d0),d1
Move (a1,d0),d2
Muls d2,d6
Muls d1,d7
Sub d7,d6
Add.l d6,d6
Swap d6 ;Calculation of x1
Muls d2,d4
Muls d1,d3
Add d3,d4
Add.l d4,d4
Swap d4 ;Calculation of y1
etc......
Now up until now we haven't considered
how the lines will be drawn to the
screen, I shall assume you have access
to a blitter line draw routine, if not
there is one included on the disk,
which is from the System Programmers
Guide. There are two options open now
we can leave the coordinates as they
are and simply add a displacement to
them before plotting the lines, or go
for the more realsitic technique of
perspective. This invloves scaling the
x,y coords. according to how far into
the screen we are. A reasonable way of
doing that is as follows
x,y,z in d3,d4,d5
Add #Depth+Scale,d5
Move.l #Scale*65536,d6
Divu d6,d5
Muls d5,d3 ;Scale the X coord
Add.l d3,d3
Swap d3
Muls d5,d4 ;Scale the Y coord
Add.l d3,d4
Swap d4
Alternatively you can use a table of
scaling values.
Now all that remains is to plot the
lines. Dont forget up until now all
vertices have been calculated with the
origin at (0,0) but now we must move
the origin to the centre of the screen
or where ever else you want it. This
means adding a displacement to each
pair of coordinates.
To see how these techniques are
implemented I've included some source
for you to examine.
These routines can easily be adapted
to other purposes, eg.to create vector
bobs, use a single point for each bob
and before plotting sort the z
coordinates and plot the bobs in
reverse order, also a simple form of
hidden line removal can be implemented
by creating a list of surfaces,
calculating the normals to these
surfaces and if the normals point away
from you dont plot any lines in the
surface. For an example of this see my
Magnetic Fields Party Demo.
Next month I will write about sine
scrollers, Kreator .......